응용프로그램, 운영체제, 컴퓨터 하드웨어(시스템 리소스) 관계응용 프로그램은 운영체계에게 필요한 하드웨어를 요청하고 운영체계는 이를 할당하고 관리함
CPU Memory IO Decvices등을 OS가 관리하여 응용 프로그램에게 분배
운영체제는 사용자 인터페이스 제공 - 쉘(Shell)
사용자가 운영체제 기능과 서비스를 조삭할 수 있도록 인터페이스를 제공하는 프로그램
쉘은 터미널 환경(CLI)과 GUI 환경 두 종류로 크게 분류
Shell도 하나의 응용 프로그램으로 볼 수 있다.
Shell 또한 API로 변환되어 OS로 전달
운영체제는 응용 프로그램을 위해서도 인터페이스를 제공 - API(Application Programming Interface)
함수로 제공
open(), printf() ...
- 보통은 라이브러리(library) 형태로 제공
C library
API를 이용하지 않고는 OS에게 명령을 하기 어렵다. - 이용하지 않으면 보다 저수준으로 작업해야 한다.
API는 소스코드 기반, ABI는 이진 인터페이스 기반이다.
API응용프로그램에서 운영체제나 프로그래밍 언어가 제공하는 기능을 제어 할 수 있게 만든 인터페이스
필요한 부분을 요청하여 응답을 받는 서비스간의 다리와 같은 역할을 한다.
구현과 독립적으로 사양만 정의 되어 있으며, 접근 권한을 부여 받아야 한다.
말그대로 인터페이스로 안에 무엇이 들어있는지 알 수 없다.
ex) C API, google API ...
라이브러리(library)응용 프로그램 개발을 위해 필요한 기능을 모아 놓은 소프트웨어
응용프로그램이 능동적으로 라이브러리를 사용할 수 있다. 기능을 어떻게 사용할지는 사용자가 결정한다.
작은 기능들은 함수 단위로 만들어 제공하며, 기능을 어떻게 사용할지 사용자가 결정한다.
대체 가능한 다른 대체품을 찾기가 쉽다
ex) jQuery
플레임워크(Framework)응용프로그램이나 소프트웨어의 솔루션 개발을 수월하게 하기 위해 제공된 소프트웨어 환경
응용프로그램이 수동적으로 플레임워크에 의해 사용된다. 규칙을 지켜가며 사용해야 한다.
ex) Vue, React, Angular, django
시스템 콜 시스템 콜 또는 시스템 호출 인터페이스
운영체제가 운영체제 각 기능을 사용할 수 있도록 시스템 콜이라는 명령 또는 함수를 제공한다.
API 내부에는 시스템콜을 호출하는 형태로 만들어져 있는 경우가 대부분이다.
API는 시스템콜을 호출함으로써 OS를 통해 하드웨어를 사용
시스템 호출이란 프로그래밍 언어에서 지원하지 않는 기능에 대하여 운영 체제의 루틴을 호출하여 이용하는 것을 말한다. 시스템 호출의 세 가지 기능은 다음과 같다.
1. 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 한다.
2. 시스템 호출을 하면 사용자 모드에서 커널 모드로 바뀐다.
3. 커널에서 시스템 호출을 처리하면 커널 모드에서 사용자 모드로 돌아가 작업을 계속한다.
시스템 호출의 유형
1. 프로세스 제어(process Control)
2. 파일 조작(file manipulation)
3. 장치 관리(Device Management)
4. 정보 유지(Information maintenance)
5. 통신(Communication)
리눅스 커널의 장치 드라이버와 시스템 호출 예
static struct file_operations hw_mydrv_fops = {
.owner = THIS_MODULE,
.open = mydrv_open,
.release = mydrv_release,
.read = mydrv_read,
.write = mydrv_write,
.unlocked_ioctl = mydrv_ioctl,
};
static struct miscdevice hw_mydrv_driver = {
.minor = MISC_DYNAMIC_MINOR,
.name = "mydrv",
.fops = &hw_mydrv_fops,
};
위의 리눅스 커널의 장치 드라이버를 아래의 응용 프로그램을 이용하여 호출
char gbuff[100];
int main(int argc, char*argv[])
{
int leng;
int fp;
fp = open("/dev/mydrv", ....);
gbuff[0] = 10;
gbuff[1] = 20;
leng = 2;
write(fp, (void*) gbuff, leng);
close(fp);
return 0;
}
결론적으로 우리는 Application( C, Java, Python과 같은 프로그래밍 언어 )
혹은 Shell(Terminal, cmd)를 사용함으로써 API를 사용하고 이 API에 정의된 System Call을 이용해서 OS를
동작한다.
int callee(int, int, int);
int caller(void)
{
register int ret;
ret = callee(1, 2, 3);
ret += 5;
return ret;
}
위의 C 소스 코드는 아래의 어셈블리어를 만들어낸다.
.globl caller
caller:
pushl %ebp
movl %esp,%ebp
pushl $3
pushl $2
pushl $1
call callee
addl $12,%esp
addl $5,%eax
leave
ret
운영체제의 개발 순서1. kernel: 핵심 운영체제 기능 구현
2. 시스템 콜을 개발(보통은 C/C++언어로 개발)
-> 리눅스는 C언어로 개발되어 있기에 C언어를 통해서 직접 시스템 콜을 사용할 수 있다.
보통은 API를 통해서 호출
3. 언어별로 API를 개발(각 언어별 인터페이스)
4. Shell 프로그램 개발
5. 응용프로그램 개발
운영체제와 시스템콜 - 시스템콜 정의 예
POSIX API(LINUX), 윈도우 API